package org.dezenho.server.SO;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.dezenho.common.RMI.ClientMoq;
import org.dezenho.server.RN.Jogador;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * Teste da funcionalidade Inserir Usu�rio na Sala de Esepera
 * 
 * @author marcelasobrinhopereira
 * 
 */
public class TesteInserirSalaEspera {

	private static Jogador jogador1;
	private static Jogador jogador2;
	private static Jogador jogador3;
	private static Jogador jogador4;

	/**
	 * Inicializacao do servidor
	 * 
	 * @throws Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		jogador1 = new Jogador(new ClientMoq(), "1", "1");
		jogador2 = new Jogador(new ClientMoq(), "2", "2");
		jogador3 = new Jogador(new ClientMoq(), "3", "3");
		jogador4 = new Jogador(new ClientMoq(), "4", "4");
		List<Jogador> listaJogadores = new ArrayList<Jogador>();
		listaJogadores.add(jogador1);
		listaJogadores.add(jogador2);
		listaJogadores.add(jogador3);
		listaJogadores.add(jogador4);
		DezenhoServer.getInstance().setJogadoresConectados(listaJogadores);

	}

	/**
	 * Teste: tenta inserir na sala de espera um jogador n�o conectado
	 */
	@Test
	public void testeJogadorNaoConectado() {
		// Jogador n�o est� conectado, n�o est� na lista de jogadores Conecados
		// do Servidor
		DezenhoServer.getInstance().insereJogadorSalaEspera("5");
		assertEquals(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().size(), 0);
	}

	/**
	 * Teste: tenta inserir o primeiro jogador conectado na sala de espera
	 */
	@Test
	public void testePrimeiroJogador() {
		DezenhoServer.getInstance().insereJogadorSalaEspera("1");
		assertTrue(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().contains(jogador1));
	}

	/**
	 * Teste: tenta inserir o segundo jogador conectado na sala de espera
	 */
	@Test
	public void testeSegundoJogador() {
		DezenhoServer.getInstance().insereJogadorSalaEspera("2");
		assertTrue(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().contains(jogador1));
		assertTrue(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().contains(jogador2));
	}

	/**
	 * Teste: tenta inserir o terceiro jogador conectado na sala de espera
	 */
	@Test
	public void testeTerceiroJogador() {
		DezenhoServer.getInstance().insereJogadorSalaEspera("3");
		assertTrue(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().contains(jogador1));
		assertTrue(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().contains(jogador2));
		assertTrue(DezenhoServer.getInstance().getSalaEspera()
				.getJogadoresEspera().contains(jogador3));
	}

	/**
	 * Teste: tenta inserir o quarto jogador conectado na sala de espera Neste
	 * caso, deve ser iniciada nova partida
	 */
	@Test
	public void testeQuartoJogador() {
		DezenhoServer.getInstance().insereJogadorSalaEspera("4");
		// Sala Vazia
		assertEquals(new ArrayList<Jogador>(), DezenhoServer.getInstance()
				.getSalaEspera().getJogadoresEspera());
		// Primeira Partida do Servidor, id = 1
		// Partida Iniciada
		assertNotNull(DezenhoServer.getInstance().getPartida(1));
		// Rodada iniciada
		assertNotNull(DezenhoServer.getInstance().getPartida(1).getRodada());
	}

}
